iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
Mobile Development

[Android Studio & Spring boot 30天挑戰]系列 第 17

[Android Studio & Spring boot 30天挑戰] D17 - 讀取照片

  • 分享至 

  • xImage
  •  

我們將討論如何在 Android 應用程序中讀取照片。這是一個常見的任務,許多應用程序需要允許用戶選擇圖像,上傳圖片,或者只是在應用程序中顯示圖像。我們將介紹幾種方法來實現這個功能。

使用 Intent 選擇圖片

在許多情況下,您可能希望讓用戶選擇他們自己的圖片。這可以通過 Android 的 Intent 機制實現。以下是一個簡單的示例,演示如何啟動圖像選擇 Intent 並處理所選圖像。

在 onCreate 設定跳頁到相簿和存放選擇相片

// 在您的 Activity 中啟動圖像選擇 Intent
    private Button btn_picker;
    private ImageView imageView;
    private ContentResolver resolver;
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_picker=(Button) findViewById(R.id.button);
        imageView=(ImageView) findViewById(R.id.imageView);
        resolver=this.getContentResolver();
        btn_picker.setOnClickListener(view->{
            //打開相簿
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            //選擇相片後接回傳
            startActivityForResult(intent, 1);
        });
    }

在 onActivityResult 中處理所選圖像

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Uri uri=data.getData();
    try {
        Bitmap bitmap= BitmapFactory.decodeStream(resolver.openInputStream(uri));
        imageView.setImageBitmap(bitmap);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

這種方法允許用戶選擇他們的圖像,然後將所選圖像的 URI 返回給應用程序。您可以使用這個 URI 來讀取圖像,並進行進一步的處理。

使用 Android 內部存儲

在 onCreate 方法中設置了按鈕的點擊監聽器,當按鈕被點擊時,執行 takePhoto 方法,該方法用於處理拍照操作,包括設置檔案名稱、啟動相機應用程序等等。剩餘的詳細實現細節可以在 takePhoto 方法中完成。

    private Button button;
    private ImageView imageView;
    private Uri uri;
    private String fileName;
    private final static int CAMARA_CODE = 500;
    private final static int PERMISSION_REQUEST_CODE = 0;
    private final String[] permissions = new String[]{
        // 所需的權限:讀取外部儲存、寫入外部儲存、相機
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.CAMERA
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化介面元素
        imageView = (ImageView) findViewById(R.id.imageView);
        button = (Button) findViewById(R.id.button);

        // 如果運行的 Android 版本 >= 6.0(API 23),需要請求必要的權限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(permissions, PERMISSION_REQUEST_CODE);
        }

        // 設定按鈕的點擊監聽器
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                camara();
            }
        });
    }
}

這個程式碼的主要功能是拍攝照片,它簡化了生成檔案名稱、檢查目錄和創建照相Intent的過程。當按下按鈕時,它將生成一個以當前時間命名的檔案名稱,確保唯一性,然後檢查並建立照片存儲目錄。最後,它創建一個照相Intent,並指定了照片的輸出位置。

private void camara() {
    //圖片名稱,用時間格式(年月日時分秒)來命名,這樣的命名,就不會重覆的情況。
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
    Date date = new Date(System.currentTimeMillis());
    fileName = format.format(date);

    //創建目錄的路徑。
    String path =Environment.getExternalStorageDirectory().getPath()+"/Documents";
    //New出檔案路徑的File
    File saveImage = new File(path,fileName+".jpg");
    //先判斷是否有此檔案,再建立文字檔
    if (!saveImage.exists()) {
        try {
            saveImage.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    else Log.e("note", "existsDir" );

    //將File對像轉換為Uri並啟動照相程序
    uri = FileProvider.getUriForFile(this, Environment.getExternalStorageDirectory().getPath()+"/Documents" , saveImage);
    //啟動照相功能
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    //指定圖片輸出地方。
    intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
    //拍完照startActivityForResult() 結果返回onActivityResult() 函數
    startActivityForResult(intent,CAMARA_CODE);
}

這段程式碼的作用是處理從相機拍攝照片後的回傳結果,並將照片顯示在應用程式的介面上。它包括解碼照片、旋轉照片以及顯示照片的功能。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //圖片解析成Bitmap
    Bitmap bitmap = null;
    Matrix m=new Matrix();
    //順時針旋轉90度
    m.postRotate(90);
    Log.e("111", "onActivityResult:" + uri );
        try {
            bitmap = BitmapFactory.decodeStream(
                    getContentResolver().openInputStream(uri));
            int width=bitmap.getWidth();
            //取得圖片的長度
            int height=bitmap.getHeight();
            bitmap=Bitmap.createBitmap(bitmap, 0, 0, width, height, m, true);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        //將照片顯示出來
        imageView.setImageBitmap(bitmap);
}

上一篇
[Android Studio & Spring boot 30天挑戰] Day16- MQTT(下)
下一篇
[Android Studio & Spring boot 30天挑戰] Day18- QRCode
系列文
[Android Studio & Spring boot 30天挑戰]30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言